AWS Glue StudioでPIIデータをSHA-256でハッシュ化してみた
データアナリティクス事業本部の鈴木です。
AWS Glueでは、データソース内の個人識別情報を識別して処理を行うことができます。
DevelopersIOでも過去に以下のような記事でこの機能が紹介されていました。
- AWS Glue で機密データを処理出来る Sensitive data detection API に日本向けのデータパターンが追加されたので試してみた | DevelopersIO
- AWS Glue Databrewを利用した個人データ自動マスキングのデータパイプラインを検証してみた | DevelopersIO
今回は改めて自分でも試してみて、特にまだ検証記事がなかったApply cryptographic hashを使った対処方法を選択した際の結果をご紹介します。
やりたいこと
以下のようにGlue StudioからGlue Jobを作成して、あるS3にある個人情報を含むデータを読み込み、別のS3に該当の情報をSHA-256でハッシュ化して出力したいです。
機密データ検出の対象となるデータタイプは、以下のGlueのデベロッパーガイドに記載がありました。
AWS GlueのPIIを識別する機能はETLパイプライン内で検出とマスクを行いたい場合に利用できます。検出したいパターンをカタログから選ぶと自動で検出してくれるのでとても便利でした。リソースをPIIの識別用に用意できるのも特徴の一つですね。
準備
データの作成
この記事で利用している検証用ダミーデータの生成は以下のツールを利用して作成しました。
以下のようなCSVファイルを作成しました。
"名前","年齢","都道府県","性別","誕生日","マイナンバー","職業","運転免許番号" "***","28","新潟県","男","1994/12/04","2416-4241-1680","サラリーマン","469402386840" "***","37","大阪府","女","1985/12/15","3662-2389-7210","サラリーマン","628505690240" "***","36","東京都","男","1987/03/03","9859-0305-4340","フリーター","308608503420" "***","29","福井県","女","1994/01/07","1947-6056-4191","サラリーマン","529303498600" "***","21","大阪府","女","2002/03/28","2139-2872-6090","大学生","-" "***","35","埼玉県","男","1988/02/09","8334-0133-9924","サラリーマン","438700818211" "***","40","群馬県","男","1983/01/12","3200-3500-2981","サラリーマン","428204219780" "***","30","三重県","男","1992/06/01","4274-7409-3968","サラリーマン","559200033290" "***","34","大阪府","女","1988/11/28","8150-4427-9618","サラリーマン","628804157140"
ダミーデータではありますが、偶然の一致を避けるため、氏名はあらかじめマスクしておきました。
今回機密データ検出の対象として想定しているのは、マイナンバーおよび運転免許番号です。
データのS3バケットへのアップロード
以下のようにデータソースとなるバケットへアップロードしておきました。
Glue Jobで使うIAMロールの作成
以下のテンプレートでGlue Jobで使うIAMロールを作成しておきました。
AWSTemplateFormatVersion: "2010-09-09" Description: Creating Glue Studio Execution Role for Pii Detection Parameters: PiiDataBucketName: Description: Backet Name for Pii Sample Data. Type: String MartBucketName: Description: Backet Name for Data Mart. Type: String Resources: GlueStudioExecutionRole: Type: AWS::IAM::Role Properties: RoleName: AWSGlueServiceRole-Studio-CM-nayuts AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: glue.amazonaws.com Action: "sts:AssumeRole" Path: "/" Policies: - PolicyName: GlueStudioS3AccessPolicy PolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Action: [ "s3:*" ] Resource: [ !Sub "arn:aws:s3:::${PiiDataBucketName}", !Sub "arn:aws:s3:::${PiiDataBucketName}/*", !Sub "arn:aws:s3:::${MartBucketName}", !Sub "arn:aws:s3:::${MartBucketName}/*" ] ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole
IAMロール名は、AWS Glue Studio のセットアップ - AWS Glue StudioでAWSGlueServiceRoleの文字列で始まる必要がある旨が記載されていたので、それに沿った命名としています。
Glue Jobを作成
データソース
以下のように設定しました。
データターゲット
以下のように設定しました。今回はCSVで出力するようにFormatを設定しました。
変換
Node type
でDetect Sensitive Data
を選択しました。
Transform
タブでは以下のように選択しました。今回はFind sensitive data in each row
を選択し、Select specific patterns
にてJapan Driving License
とJapan My Number
の2つを選びました。またSHA-256でハッシュ化したいので、ActionsでApply cryptographic hash
を選びました。
なお、Select specific patterns
ではBrowse
ボタンを押すと以下のように適用するパターンを選択することができました。
Glue Jobの詳細設定
Job details
タブからIAM RoleをCloudFormationで作成したものを使うように設定しておきました。また、Requested number of workers
は2
にしておきました。
Glue Jobの実行
コンソール右上のRun
ボタンからJobを実行し、成功することを確認しました。
データターゲットで指定したパスに以下のデータが出力されることを確認できました。
名前,年齢,都道府県,性別,誕生日,マイナンバー,職業,運転免許番号 "***",28,新潟県,男,1994/12/04,"a495ea36a6e6045528315bfac4c6c9282c8d8166e3dd60de43dec321ddddc9a8",サラリーマン,"9a58bcb51083857d71405533b8d385e00b0d71687f0677e910ae614419a86f20" "***",37,大阪府,女,1985/12/15,"62f97a458a8d7dc55630faac356d4c79210041fae44ddf94393edbdd88b6eb64",サラリーマン,"73929ba081971219282b8c207be756418c37c1329d94fff16bc4a7a6d293b461" "***",36,東京都,男,1987/03/03,"699894c233dfd4a7986b83deae6a355b8e78ece0605ed47e954c7d6db675d489",フリーター,"58d85c437d37b07ea1da8a6e50bade93f473d6547e927f259f16b99b37d97bfa" "***",29,福井県,女,1994/01/07,"b934ed439049215e8ad2d185480b6d859177800ef64c56ff225017f06a872493",サラリーマン,"b1c81d2937ac9f157e781278e0ef418e4f120cea90f2d56611eab7ecd62ae104" "***",21,大阪府,女,2002/03/28,"9fc4131df9f219c6e35d565905ff72ad599338370b1203c363c47892498afc71",大学生,- "***",35,埼玉県,男,1988/02/09,"a9de3d736fbcb2cbb5949d0dd68ec98e612f4193408e5a1123169b9c172d5c19",サラリーマン,"71626b6c01d81185c15bc2f3b123459c6f8a92b5c9498ff4a30ff0b4ce4a96e5" "***",40,群馬県,男,1983/01/12,"883577b551182b8d2afec68d180540161b3bf00c93a695e391ef99d68bbd00d4",サラリーマン,"b81e41a7dd39e1b3c52144ec4ca48d81f8c3fb888f0635e69c8775c6b355ce62" "***",30,三重県,男,1992/06/01,"700ecaeaefbc434d277bb9a15311ee7bf075494199aab6da83c7e41fa34c4501",サラリーマン,"c1167aa382827014383f460a9df1642d60a7d1a1161e6aad5d46157e847da991" "***",34,大阪府,女,1988/11/28,"8048717ca5f67ec361f5fe76d9e2fb3a8ee344f83a6ff145d0bde071d40288ee",サラリーマン,"3e350ee785b37d34175f3bc834cb71807f529609e779709d695a5d85f5dff5fa"
補足
機密データの検出のためのスクリプトの実装について
Script
タブからビジュアルエディタで実装した内容をPythonスクリプトにしたものが確認できますが、機密データの検出をPythonスクリプトでどのように記述すればいいのか確認できたので補足として記載します。
Glue Studio外でこの機密データ検出機能を使用できることは以下のページにも紹介がありますが、具体的な実装をPythonでどうするのがよさそうかあまり情報を見つけられなかったので困っていました。
今回の実装についてはScript
タブを開くと以下のようにスクリプトが表示されており、非常に参考になりました。
Glue Studioでは作ることができるけれど、スクリプト単体ではどのように書くとよいか分からないものについては、Script
タブで内容を調べるとよいかもしれません。
終わりに
今回は、AWS Glue Studioでデータソース内の個人識別情報を識別して、SHA-256でハッシュ化する検証をしてみました。
参考になりましたら幸いです。